//============================================================================
// Name        : ServerMatch.cpp
// Author      :
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
/*******************************************************************/
#include <sys/ipc.h> //para semaforos
#include <sys/shm.h> //memoria compartida
#include <semaphore.h> //para los semaforos que usamos
#include <fcntl.h> // algunas funciones de semaforos
/**********************************************************************/

////////////////////////////////////////  estructura memoria compartida /////////////////////////////////////////////////
#define MAXCLI 10

typedef struct{
	int  id,socket,
		 puntaje,
		 disponible,
		 cantPartidas,
		 conectado,
		 posicionEnTorneo; //1 conectado puntaje dentro del torneo
	char nombre[10];

}t_jugador;

typedef struct{
	int  pid,
	     jugador1,
	     jugador2,
	     terminoPartida,
	     jugadorGanador; //ganador (1 o 2)
}t_partida;

typedef struct{
	t_jugador jugador[MAXCLI];
	//int matrizTorneo[MAXCLI][MAXCLI];
	int cantPartidas;
	t_partida partidas[50];
	int cantJugadores;
	//GP
	int t_chequeo;
	int tiempo_torneo; //GPMA
	int tiempo_espera_conex_max;
	int nivel_dificultad;
	int cantidad_rescates;
	//int flagFinConexiones;

	int partidaCaida; //1 se cayo la partida
}t_torneo;

//variable global para guardar el id de la memoria compartida.
int id_memo;
//variable global para acceder a los datos de torneo.
t_torneo *torneo;
//variable global para el semaforo de la memoria
sem_t *semMemoria;

void crearMemoriaCompartida(key_t clave){

	//genero memoria compartida.
	id_memo = shmget(clave,sizeof(t_torneo),IPC_CREAT | 0666);
	//printf ("id_memo Torneo %d\n", id_memo);
	if(id_memo < 0){
		fprintf(stderr , "Error al crear la memoria compartida.\n");
		exit(0);
	}

	torneo = (t_torneo *) shmat(id_memo,NULL,0);
}
void crearSemaforos()
{
	sem_unlink("/semMemoria");
	sem_unlink("/semPartidas");

	semMemoria = sem_open("/semMemoria",O_CREAT,0644,1);
}

void liberarRecursos()
{
	puts("Liberando semáforos y memoria compartida");

	shmdt((t_torneo *)torneo);
	/////shmctl(id_memo,IPC_RMID, NULL);   NO PONER.
	sem_close(semMemoria);

	sem_unlink("/semMemoria");
	sem_unlink("/semPartidas");
	exit(1);
}

int main() {

	int i,miPid;
	miPid = getpid();
	printf("Mi pid es %d  .......................   ",miPid);
	srand(time(NULL));
	int tiempoDeEspera = (rand()%15);
	printf("mi tiempo de espera: %d\n",tiempoDeEspera);

	//genero la llave para la memoria compartida
	key_t clave;
	clave = ftok("/bin/cp",222);
	crearMemoriaCompartida(clave);
	crearSemaforos();


	sleep(tiempoDeEspera);


	sem_wait(semMemoria);

	int p;
	for(p=0;p < torneo->cantPartidas;p++){
		if(getpid()==torneo->partidas[p].pid){
			torneo->partidas[p].jugadorGanador = 1;  //le paso la posicion del vector donde esta su partida.

			//printf("%d \n",torneo->partidas[p].jugadorGanador);
			//printf("%s \n",	torneo->jugador[torneo->partidas[p].jugador1].nombre);
			//printf("%s \n",	torneo->jugador[torneo->partidas[p].jugador2].nombre);
		}
	}
	sem_post(semMemoria);

	liberarRecursos();

	return 0;
}


